package com.smc.demo.activity.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * Created by zhujm on 2020/9/6.
 */

public abstract  class RefectUtil {

    protected abstract Object createInstance();

    /**
     * 执行反射方法
     * @param clsName   类名
     * @param mName     方法名
     * @param args      方法参数
     * @return
     */
    protected Object invokeMethod(String clsName, String mName, Object... args){
        try {
            Object instance = createInstance();
            Method method = getMethod(clsName, mName);
            Object resObj = method.invoke(instance, args);
            return resObj;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取类对象属性
     * @param clsName   类名
     * @param name      属性名
     * @return
     */
    protected Object getAttr(String clsName, String name){
        try {
            Object instance = createInstance();
            Field field = getField(clsName, name);
            return field.get(instance);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取方法
     * @param clsName   类名
     * @param mName     方法名
     * @return
     */
    protected Method getMethod(String clsName, String mName){
        try {
            Class<?> clazz = Class.forName(clsName);
            Method method = clazz.getDeclaredMethod(mName);
            method.setAccessible(true);
            return method;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取类属性
     * @param clsName   类名
     * @param fName     属性名
     * @return
     */
    protected Field getField(String clsName, String fName){
        try {
            Class<?> clazz = Class.forName(clsName);
            Field field = clazz.getDeclaredField(fName);
            field.setAccessible(true);
            return field;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

